<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>String.raw()</title>
</head>
<body>
  <script>
    /*
    ES6还未原生的String对象，提供了一个raw()方法。该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串
    往往用于模板字符串的处理方法
    */
   let a = String.raw`Hi\n${2+3}`
   console.log(a) // Hi\n5
   // 实际返回 "Hi\\n5!"，显示的是转义后的结果 "Hi\n5!"
   // 如果原字符串的斜杠已经转义，那么String.raw()会进行再次转义
   let b = String.raw`Hi\\n`
   console.log(b) // Hi\\\\n      实际上得到的结果是 Hi\\n
   // String.raw()方法可以作为处理模板字符串的基本方法，它会将所有变量替换，而且对斜杠进行转义，方便下一步作为字符串来使用。
  </script>
  <script>
    // String.raw()本质上是一个正常的函数，只是专用于模板字符串的标签函数。如果写成正常函数的形式，它的第一个参数，应该是一个具有raw属性的对象。
    // 且raw属性的值应该是一个数组，对应模板字符串解析后的值。
    `foo${1+2}bar`
    // 等同于
    String.raw({raw: ['foo', 'bar',]}, 1+2)// "foo3bar"
    /*
    上面代码中，string.raw()方法的第一个参数是一个对象，它的raw属性等同于原始的模板字符串解析后得到的数组。
    作为函数，String.raw()的代码实现基本如下。
    */
   String.raw = function(strings, ...values) {
     let output = ''
     let index
     for(index = 0; index < values.length; index++) {
       output += strings.raw[index] + values[index]
     }
     output += strings.raw[index]
     return output
   }
  </script>
</body>
</html>